/**
 * interface que contempla todas as funcionalidades do sistema.
 * 
 * @author			Paulo Lima
 * @corporation 	TeckSoft 2014
 * @project 		Araujo Seguros
 * @version 		1.0 
 * @since			Release 1  16/02/2014
 */
package facade;

import java.io.IOException;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.List;

import models.Cliente;
import models.Endereco;
import models.Pagamento;
import models.Parcela;
import models.ParcelaVencida;
import models.Usuario;
import repository.RepositorioCliente;
import repository.RepositorioControle;
import repository.RepositorioEndereco;
import repository.RepositorioPagamento;
import repository.RepositorioParcela;
import repository.RepositorioUsuario;
import util.Backup;
import util.Data;
import util.Validacao;
import controllers.ControllerCliente;
import controllers.ControllerEndereco;
import controllers.ControllerGeral;
import controllers.ControllerPagamento;
import controllers.ControllerParcela;
import controllers.ControllerUsuario;

public class Fachada {

	private static Fachada instancia;
	private ControllerCliente cliente;
	private ControllerEndereco endereco;
	private ControllerPagamento pagamento;
	private ControllerParcela parcela;
	private ControllerUsuario usuario;
	private ControllerGeral geral;
	private Backup backup;
	private Data data;
	private Validacao validacao;

	// Metodo para iniciar todos os Repositorios e controladores
	// ---------------------------------------------------------------------
	private void iniciarControladores() {

		RepositorioCliente rc = new RepositorioCliente();
		cliente = new ControllerCliente(rc);

		RepositorioEndereco re = new RepositorioEndereco();
		endereco = new ControllerEndereco(re);

		RepositorioPagamento rp = new RepositorioPagamento();
		pagamento = new ControllerPagamento(rp);

		RepositorioParcela ra = new RepositorioParcela();
		parcela = new ControllerParcela(ra);

		RepositorioUsuario ru = new RepositorioUsuario();
		usuario = new ControllerUsuario(ru);

		RepositorioControle rt = new RepositorioControle();
		geral = new ControllerGeral(rt);

		data = new Data();

		validacao = new Validacao();

		backup = new Backup();
	}

	// Contrutor da classe
	// ---------------------------------------------------------------------
	private Fachada() {
		iniciarControladores();
	}

	// Metodo para verificar se a fachada ja existe ou instancia o mesmo.
	// ---------------------------------------------------------------------
	public static Fachada getInstance() {

		if (instancia == null) {
			instancia = new Fachada();
		}
		return instancia;
	}

	// ---------------------------------------------------------------------
	// ************************* Cliente **********************************
	// ---------------------------------------------------------------------
	public boolean inserirCliente(Cliente cliente) throws SQLException {
		return this.cliente.inserir(cliente);
	}

	// ---------------------------------------------------------------------
	public boolean removerCliente(Cliente cliente) throws SQLException {
		return this.cliente.remover(cliente);
	}

	// ---------------------------------------------------------------------
	public boolean atualizarCliente(Cliente cliente) throws SQLException {
		return this.cliente.atualizar(cliente);
	}

	// ---------------------------------------------------------------------
	public List<Cliente> listarCliente() throws SQLException {
		return this.cliente.listar();
	}

	// ---------------------------------------------------------------------
	public List<Cliente> buscarClienteApolice(String chave) throws SQLException {
		return this.cliente.buscarApolice(chave);
	}

	// ---------------------------------------------------------------------
	public List<Cliente> buscarClienteCI(String chave) throws SQLException {
		return this.cliente.buscarCI(chave);
	}

	// ---------------------------------------------------------------------
	public List<Cliente> buscarClienteInicioVigencia(String chave)
			throws SQLException {
		return this.cliente.buscarInicioVigencia(chave);
	}

	// ---------------------------------------------------------------------
	public List<Cliente> buscarClienteTerminoVigencia(String chave)
			throws SQLException {
		return this.cliente.buscarTerminoVigencia(chave);
	}

	// ---------------------------------------------------------------------
	public int ultimoIdCliente() throws SQLException {
		return this.cliente.ultimoId();
	}

	// ---------------------------------------------------------------------
	public boolean verificarApolice(String chave) throws SQLException {
		return this.cliente.verificarApolice(chave);
	}

	// -------------------------------------------------------------------
	public boolean verificarCI(String chave) throws SQLException {
		return this.cliente.verificarCI(chave);
	}

	// -------------------------------------------------------------------
	public List<Cliente> faltaDadosCIApolicePlacaRENAVAN() throws SQLException {
		return this.cliente.faltaDadosCIApolicePlacaRENAVAN();
	}

	// -------------------------------------------------------------------
	public Cliente retornaCliente(int id) throws SQLException {
		return this.cliente.retornaCliente(id);
	}

	// ---------------------------------------------------------------------
	public List<Cliente> DatasTerminoVigencia() throws SQLException {
		return this.cliente.DatasTerminoVigencia();
	}

	// -------------------------------------------------------------------
	// Bem Segurado
	// -------------------------------------------------------------------

	public List<Cliente> buscarBemSeguradoChassi(String chave)
			throws SQLException {
		return cliente.buscarBemSeguradoChassi(chave);
	}

	// -------------------------------------------------------------------

	public List<Cliente> buscarBemSeguradoPlaca(String chave)
			throws SQLException {
		return cliente.buscarBemSeguradoPlaca(chave);
	}

	// -------------------------------------------------------------------

	public List<Cliente> buscarBemSeguradoVeiculo(String chave)
			throws SQLException {
		return cliente.buscarBemSeguradoVeiculo(chave);
	}

	// -------------------------------------------------------------------

	public boolean verificarChassi(String chave) throws SQLException {
		return cliente.verificarChassi(chave);
	}

	// -------------------------------------------------------------------

	public boolean verificarRENAVAN(String chave) throws SQLException {

		return cliente.verificarRENAVAN(chave);
	}

	// -------------------------------------------------------------------

	public boolean verificarPlaca(String chave) throws SQLException {
		return cliente.verificarPlaca(chave);
	}

	// -------------------------------------------------------------------

	// Segurado
	// -------------------------------------------------------------------
	public List<Cliente> buscarSeguradoCNH(String chave) throws SQLException {
		return cliente.buscarSeguradoCNH(chave);
	}

	// -------------------------------------------------------------------

	public List<Cliente> buscarSeguradoProponente(String chave)
			throws SQLException {
		return cliente.buscarSeguradoProponente(chave);
	}

	// -------------------------------------------------------------------

	public List<Cliente> buscarSeguradoCPF(String chave) throws SQLException {
		return cliente.buscarSeguradoCPF(chave);
	}

	// -------------------------------------------------------------------

	public List<Cliente> aniversariantes() throws SQLException {
		return cliente.aniversariantes();
	}

	// -------------------------------------------------------------------

	// -------------------------------------------------------------------
	// ************************* Endereco **********************************
	// ---------------------------------------------------------------------
	public boolean inserirEndereco(Endereco endereco) throws SQLException {
		return this.endereco.inserir(endereco);
	}

	// ---------------------------------------------------------------------
	public boolean removerEndereco(Endereco endereco) throws SQLException {
		return this.endereco.remover(endereco);
	}

	// ---------------------------------------------------------------------
	public boolean atualizarEndereco(Endereco endereco) throws SQLException {
		return this.endereco.atualizar(endereco);
	}

	// ---------------------------------------------------------------------
	public List<Endereco> listarEndereco() throws SQLException {
		return this.endereco.listar();
	}

	// ---------------------------------------------------------------------
	public List<Endereco> buscarEndereco(String chave) throws SQLException {
		return this.endereco.buscar(chave);
	}

	// ---------------------------------------------------------------------
	public Endereco retornaEndereco(int id) throws SQLException {
		return this.endereco.retornaEndereco(id);
	}

	// ---------------------------------------------------------------------
	// ************************* Pagamento *********************************
	// ---------------------------------------------------------------------
	public boolean inserirPagamento(Pagamento pagamento) throws SQLException {
		return this.pagamento.inserir(pagamento);
	}

	// ---------------------------------------------------------------------
	public boolean removerPagamento(Pagamento pagamento) throws SQLException {
		return this.pagamento.remover(pagamento);
	}

	// ---------------------------------------------------------------------
	public boolean atualizarPagamento(Pagamento pagamento) throws SQLException {
		return this.pagamento.atualizar(pagamento);
	}

	// ---------------------------------------------------------------------
	public List<Pagamento> listarPagamento() throws SQLException {
		return this.pagamento.listar();
	}

	// ---------------------------------------------------------------------
	public List<Pagamento> buscarPagamentoForma(String chave)
			throws SQLException {
		return this.pagamento.buscarFormaPagamento(chave);
	}

	// ---------------------------------------------------------------------
	public int ultimoIdPagamento() throws SQLException {
		return this.pagamento.ultimoId();
	}

	// ---------------------------------------------------------------------
	public Pagamento retornaPagamento(int id) throws SQLException {
		return this.pagamento.retornaPagamento(id);
	}

	// ---------------------------------------------------------------------
	// ************************* Parcela *********************************
	// ---------------------------------------------------------------------
	public boolean inserirParcela(Parcela parcela) throws SQLException {
		return this.parcela.inserir(parcela);
	}

	// ---------------------------------------------------------------------
	public boolean removerParcela(int idPagamento) throws SQLException {
		return this.parcela.remover(idPagamento);
	}

	// ---------------------------------------------------------------------
	public boolean atualizarParcela(Parcela parcela) throws SQLException {
		return this.parcela.atualizar(parcela);
	}

	// ---------------------------------------------------------------------
	public List<Parcela> listarParcela() throws SQLException {
		return this.parcela.listar();
	}

	// ---------------------------------------------------------------------
	public List<Parcela> buscarParcela(String chave) throws SQLException {
		return this.parcela.buscar(chave);
	}

	// ---------------------------------------------------------------------
	public List<Parcela> retonaParcelas(int idPagamento) throws SQLException {
		return this.parcela.retonaParcelas(idPagamento);
	}

	// ---------------------------------------------------------------------
	public List<ParcelaVencida> parcelasVencidas() throws SQLException {
		return this.parcela.parcelasVencidas();
	}

	// ---------------------------------------------------------------------
	// ************************* Usuario *********************************
	// ---------------------------------------------------------------------
	public boolean inserirUsuario(Usuario usuario) throws SQLException {
		return this.usuario.inserir(usuario);
	}

	// ---------------------------------------------------------------------
	public boolean removerUsuario(Usuario usuario) throws SQLException {
		return this.usuario.remover(usuario);
	}

	// ---------------------------------------------------------------------
	public boolean atualizarUsuario(Usuario usuario) throws SQLException {
		return this.usuario.atualizar(usuario);
	}

	// ---------------------------------------------------------------------
	public List<Usuario> listarUsuario() throws SQLException {
		return this.usuario.listar();
	}

	// ---------------------------------------------------------------------
	public List<Usuario> buscarUsuario(String chave) throws SQLException {
		return this.usuario.buscar(chave);
	}

	// ---------------------------------------------------------------------
	public boolean autenticar(String login, String senha) throws SQLException {
		return this.usuario.autenticar(login, senha);
	}

	// ---------------------------------------------------------------------
	public boolean verificarLogin(String login) throws SQLException, Exception {
		return this.usuario.verificarLogin(login);
	}

	// ---------------------------------------------------------------------
	// ************************* Controle Geral ****************************
	// ---------------------------------------------------------------------
	public boolean limparBanco() throws SQLException {
		return this.geral.limparBanco();
	}

	// ---------------------------------------------------------------------
	public boolean testeConexaoIntranet() throws SQLException {
		return this.geral.testeConexaoIntranet();
	}

	// ---------------------------------------------------------------------
	public boolean testeConexaoLocal() throws SQLException {
		return this.geral.testeConexaoLocal();
	}

	// ---------------------------------------------------------------------

	// ---------------------------------------------------------------------
	// ************************* Backup *********************************
	// ---------------------------------------------------------------------
	public boolean executaBackup(String diretorio) {
		try {
			return this.backup.executaBackup(diretorio);
		} catch (ParseException | SQLException | IOException e) {
			e.printStackTrace();
		}
		return false;
	}

	// ---------------------------------------------------------------------
	public boolean restauraBackup(String diretorio) {
		try {
			return this.backup.restauraBackup(diretorio);
		} catch (ParseException | SQLException | IOException e) {
			e.printStackTrace();
		}
		return false;
	}

	// ---------------------------------------------------------------------
	// *************************** Data ***********************************
	// ---------------------------------------------------------------------
	public List<String> dataParcela(int qtdParcela, String dataInicial,
			int melhorDia) throws ParseException {
		return this.data.dataParcela(qtdParcela, dataInicial, melhorDia);
	}

	// ---------------------------------------------------------------------
	public List<String> dataAvisoParcela(int qtdParcela, String dataInicial,
			int melhorDia) throws ParseException {
		return this.data.dataAvisoParcela(qtdParcela, dataInicial, melhorDia);
	}

	// ---------------------------------------------------------------------

	// ---------------------------------------------------------------------
	// *************************** Validacao ***********************************
	// ---------------------------------------------------------------------
	public double filtraDados(String nome) throws ParseException {
		return this.validacao.filtraDados(nome);
	}

	// ---------------------------------------------------------------------
}
